Двумерные срезы в Go
В языке программирования Go массивы и срезы являются одномерными. Для создания эквивалента 2-мерного массива либо среза надо определить массив массивов либо срез срезов. Давайте посмотрим, как это может выглядеть:

Так как срезы имеют переменную длину, то появляется возможность иметь каждый внутренний срез с различной длиной. В том же нашем LinesOfText-примере каждая строка обладает независимой длиной.

В некоторых случаях может понадобиться выделить двумерный срез. Такая ситуация может возникнуть, например, при обработке сканированных строк пикселей. Выделить 2-мерный срез можно двумя путями:
- Первый путь -- выделение каждого среза независимо.
- Второй способ заключается в выделении одного массива и указании отдельных срезов в нем.
Какой из этих путей использовать, будет зависеть от конкретного приложения. При этом стоит понимать, что если срезы могут расти либо уменьшаться, то их надо выделять независимо -- это позволит избежать перезаписи следующей строки. В обратном случае более эффективным будет построение объекта с однократной аллокацией.
Рассмотрим эти два способа подробнее. Первый вариант реализации, строка за раз:

Второй вариант реализации -- одно аллоцирование, которое разбито на строки:

По материалам сайта https://golang-blog.blogspot.c....